//
// Created by PC on 2023/2/17.
// 等差素数数列
// https://mp.weixin.qq.com/s/4Lp19qu1V96lnCeVYslkbQ
// 2,3,5,7,11,13,..是素数数列。
//7,37,67,97,127.157.这样完全由素数组成的等差数列称为等差素数列。
//上述数列的公差为30，长度为6。
//2004年。格林与陶哲轩合作证明了存在任意长度的等差素数列。这是数论领域的一项惊人成果!
//有了这理论作为基础，请你借助手中的计算机满怀信心地搜索：长度为10的等差素数列，其公差最小值是多少?
//注意:需要提交一个整数，不要填写任何多余内容和说明文字。
// 对 step, first 进行遍历 , 会限定最大值
//

#include <iostream>
#include "myNumber.h"
#include "../arrUtil.h"

using namespace std;

int main()
{
    int n = 10; // 等差数列长度
    int first; // 等差数列第一个素数
    int nums[n] = {0}; // 数组从0开始计算, 所以等差数列长度要-1

    for (first = 2; first < 800; ++first)
    {
        for (int step = 1; step < 310; ++step)
        {
//        cout<<"  step="<<step;
            nums[0] = first;
            int i = 1;
            int cur = first;
            for (; i < n; ++i)
            {
                cur++;
                if (cur - nums[i - 1] > step)
                    break;
                // 没到等差数列的间距 或者 不是素数 就继续找
                while (cur - nums[i - 1] < step or !isPrimeNumber(cur))
                {
                    cur++;
                }
                // 如果超过设定的step就不再继续了
                if (cur - nums[i - 1] > step)
                {
//            printf("gap = %d break\n",cur-nums[i-1]);
                    break;
                }
//            printf("cur = %d\n", cur);
                nums[i] = cur;
            }
            if (i == n)
            {
                printf("first = %d step = %d  i = %d \n", first,step, i); // 此时i停留在下一个应该存数的位置
                printArr(nums, n);
                break;
            }

        }

    }
    return 0;
}
